package com.zyx.util;

import org.springframework.stereotype.Component;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * MD5加密工具类
 */
@Component
public final class MD5Util {
    /**
     * 对输入字符串进行MD5加密
     * @param strSrc 要加密的字符串
     * @return 加密后的字符串
     */
    public static String encrypt(String strSrc) {
        try {
            // 定义一个字符数组，用于将字节转换为十六进制字符串
            char hexChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
                    '9', 'a', 'b', 'c', 'd', 'e', 'f' };
            // 将输入字符串转换为字节数组
            byte[] bytes = strSrc.getBytes();
            // 获取MD5加密算法的实例
            MessageDigest md = MessageDigest.getInstance("MD5");
            // 更新要加密的字节数组
            md.update(bytes);
            // 执行加密操作，返回加密后的字节数组
            bytes = md.digest();
            // 获取加密后的字节数组的长度
            int j = bytes.length;
            // 创建一个字符数组，用于存储转换后的十六进制字符串
            char[] chars = new char[j * 2];
            // 遍历加密后的字节数组，将每个字节转换为对应的十六进制字符
            for (int i = 0; i < bytes.length; i++) {
                byte b = bytes[i];
                chars[i * 2] = hexChars[b >>> 4 & 0xf];
                chars[i * 2 + 1] = hexChars[b & 0xf];
            }
            // 将字符数组转换为字符串并返回
            return new String(chars);
        } catch (NoSuchAlgorithmException e) {
            // 捕获NoSuchAlgorithmException异常，并打印堆栈跟踪，然后抛出一个运行时异常
            e.printStackTrace();
            throw new RuntimeException("MD5加密出错！！+" + e);
        }
    }
}
